package com.sakura.singleton.type05;

/**
 *  //TODO 懒汉式(同步代码块)线程安全
 *
 * 1) Double-Check概念是多线程开发中常使用到的，如代码中所示，我们进行了两
 * 次if (singleton == null)检查，这样就可以保证线程安全了。
 * 2) 这样，实例化代码只用执行一次，后面再次访问时，判断if (singleton == null)，
 * 直接return实例化对象，也避免的反复进行方法同步.
 * 3) 线程安全；延迟加载；效率较高
 * 4) 结论：在实际开发中，推荐使用这种单例设计模式
 *
 * @Author Sakura
 * @Date 2022/11/9 16:29
 * @Version 1.0
 */
public class SingletonTest05 {
}


class Singleton {

//    private static Singleton instance;
//
//    private Singleton() {}


//    //即懒汉式
//    public static Singleton getInstance() {
//        if(instance == null) {
//            /**
//             *  TODO what are you 弄啥嘞? 你自己看看这种方式有问题吗? 你瞅瞅你 线程安全保证的了吗?
//             *
//             */
//            synchronized (Singleton.class){
//                instance = new Singleton();
//            }
//        }
//        return instance;
//    }

    //TODO 正确使用方式  双重检查

    //TODO volatile  volatile是Java虚拟机提供的轻量级的同步机制
    private static volatile Singleton instance;

    private Singleton() {}

    //TODO 提供一个静态的公有方法，加入双重检查代码，解决线程安全问题, 同时解决懒加载问题,同时保证了效率, 推荐使用

    public static synchronized Singleton getInstance() {
        if(instance == null) {
            synchronized (Singleton.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }

        }
        return instance;
    }
}
